[新サービス] #SORACOM GateでIoTゲートウェイにアクセスする #scd2016
ども、大瀧です。
本日開催されているイベント「SORACOM Discovery 2016」にて発表された新サービスSORACOM Gateを早速試してみたので、そのレポートをしたいと思います。
本記事はテストフェーズの環境で検証したものです。サービスのベータ/プレビューフェーズとは仕様が異なる場合があります
SORACOM Gateとは
SORACOM GateはSORACOMモバイル閉域網とAmazon VPCを接続するSORACOM Canalのオプションとして利用するサービスです。
SORACOM Canalでは、下図のようにSIM→VPCへのトラフィックがCanalの中継サーバーである仮想プライベートゲートウェイ(以下VPG)でNATされるため、VPC→SIMへの通信ができません。
そこでGateは、VPGとVPCに接続するEC2インスタンス間にVXLANによるL2トンネルを提供することでEC2インスタンスにSORACOMモバイル閉域網のIPアドレス(10.X.X.X
)を付与し、VPC→SIMへの通信を可能にします。
SIMをセットするIoTゲートウェイなどのメンテナンスに利用できそうな便利なサービスですね。今回は試しませんが、Gateを有効にするとSIM-SIM同士の通信もVPG経由で行えるようになるとのことです。別の記事でレポートしたいと思います。
設定手順
SORACOM Gateの設定は、soracom-cliを利用します。あらかじめインストールと認証キーの設定を済ませておきましょう。
soracom-cliはバージョン0.1.0以上が必須です。必要に応じて最新バージョンをダウンロードし、上書きしましょう。
また、GateはCanalのオプションとして動作しますので、Canalの構成(VPGの作成とVPCとのピア接続)も済ませておきます。手順はこちらのエントリーを参考にしてください。最近ユーザーコンソールの[閉域網接続]からも設定出来るようになったので、コンソールで作成してもOKです。
1. VXLANインスタンスの準備
Canalで接続したVPCに、VXLANトンネルの接続先となるEC2インスタンスを作成します。OSはVXLANに対応するものであれば特に問いません、今回はAmazon Linuxを利用しました。起動したら、インスタンスのPrivate IPをメモしておきます(このあとのVXLANの構成で利用)。今回は172.21.0.100
でした。
また、セキュリティグループでVPG(100.64.0.0/16)からのVXLAN接続(UDP/4789)を許可しておきましょう。
2. Gateピアの確認
VPGを作成すると、VXLANの接続元となるGateピアが自動で割り当てられます。Gateピアは冗長のために2つ割り当てられ、soracom vpg list-gate-peers
で確認します。
suzaku:~ ryuta$ soracom vpg list-gate-peers --vpg-id XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX [ { "innerIpAddress": "10.192.158.132", "netmask": "255.128.0.0", "outerIpAddress": "100.64.158.132", "ownedByCustomer": false }, { "innerIpAddress": "10.192.158.4", "netmask": "255.128.0.0", "outerIpAddress": "100.64.158.4", "ownedByCustomer": false } ] suzaku:~ ryuta$
2つのouterIpAddress
をメモしておきましょう。このあとVXLANの設定で利用します。
3. Gateピア(EC2インスタンス)の登録
続いて、VXLANトンネルの接続先となるEC2インスタンスをGateピアに登録します。登録はsoracom vpg register-gate-peer
コマンドで実行し、--outer-ip-address
オプションにEC2のPrivate IPを指定します。
suzaku:~ ryuta$ soracom vpg register-gate-peer --vpg-id XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX \ --outer-ip-address 172.21.0.100 { "innerIpAddress": "10.225.194.171", "netmask": null, "outerIpAddress": "172.21.0.100", "ownedByCustomer": true } suzaku:~ ryuta$
レスポンスには、登録したピアのプロパティが返ってきます。先ほどと似たような表示になりますが、ownedByCustomer
がtrue
になっていることからユーザーが登録したピアということがわかります。再度soracom vpg list-gate-peers
を実行します。
suzaku:~ ryuta$ soracom vpg list-gate-peers --vpg-id XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX [ { "innerIpAddress": "10.192.158.132", "netmask": "255.128.0.0", "outerIpAddress": "100.64.158.132", "ownedByCustomer": false }, { "innerIpAddress": "10.192.158.4", "netmask": "255.128.0.0", "outerIpAddress": "100.64.158.4", "ownedByCustomer": false }, { "innerIpAddress": "10.225.194.171", "netmask": "255.128.0.0", "outerIpAddress": "172.21.0.100", "ownedByCustomer": true } ] suzaku:~ ryuta$
登録したGateピアのinnerIpAddress
とnetmask
がEC2インスタンスに設定するVXLANトンネルのIPアドレスとネットマスクになるので、これらもメモしておきましょう。各ピアのouterとinnerが入り乱れてわかりにくいので、以下の図にまとめました。
4. Gateの有効化
では、 Gateを有効化します。soracom vpg open-gate
コマンドを実行します *1。
suzaku:~ ryuta$ soracom vpg open-gate --vpg-id XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX { "createdTime": 1468221131058, "gateOpened": true, "lastModifiedTime": 1468223283319, "operatorId": "OP0067881737", "primaryServiceName": "Canal", "status": "running", "tags": { "name": "Gate-Verification2" }, "type": 12, "ueSubnetCidrRange": "10.128.0.0/9", "useInternetGateway": true, "virtualInterfaces": null, "vpcPeeringConnections": { "pcx-2055f349": { "destinationCidrBlock": "172.21.0.0/16", "id": "pcx-2055f349", "peerOwnerId": "XXXXXXXXXXXX", "peerVpcId": "vpc-1a3b667f" } }, "vpgId": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" } $
レスポンスはオプションで指定したVPGのプロパティですが、gateOpened
プロパティが追加され、true
になっていることから、Gateが有効になっていることがわかります。SORACOM側の設定はこれでOKです。
VXLANトンネルの構成
それでは、EC2インスタンスからSORACOMのGateピアとVXLANトンネルを確立します。今回は、以下のシェルスクリプトを利用しました。VXLANを利用するためのカーネルモジュールはAmazon Linuxではインストール済みのため、特に事前構成は必要ありません。
#!/bin/bash PHY_IF=$1 PHY_ADDR=$2 VXLAN_IF=$3 VXLAN_ADDR=$4 VXLAN_NETMASK=$5 shift 5 PEERS=$* VXLAN_PORT=4789 VXLAN_ID=10 rmmod vxlan modprobe vxlan udp_port=$VXLAN_PORT echo "Creating vxlan interface $VXLAN_IF" ip link add $VXLAN_IF type vxlan local $PHY_ADDR id $VXLAN_ID port $VXLAN_PORT $VXLAN_PORT dev $PHY_IF echo "Flushing previously added fdb entries" bridge fdb show dev $VXLAN_IF > /tmp/fdb_entries.txt while read entry; do bridge fdb delete $entry dev $VXLAN_IF done < /tmp/fdb_entries.txt # Configure IP address for the vxlan interface if [ "x$VXLAN_ADDR" != "x" ]; then echo "Setting IP address of $VXLAN_IF to $VXLAN_ADDR" ifconfig ${VXLAN_IF} ${VXLAN_ADDR} netmask $VXLAN_NETMASK up fi # Register peers for PEER in $PEERS do echo "Registering $PEER as a peer" bridge fdb append 00:00:00:00:00:00 dev ${VXLAN_IF} dst $PEER done
- 15行目 : VXLANインターフェースの有効化。VNIはGate側で10で決め打ちで、ユニキャストモードでセットします。
- 30行目 : for文で2回、GateピアをFDB(LinuxブリッジのMACアドレステーブル)に登録
このスクリプトをLinuxの起動時に実行するよう、/etc/rc.local
に追記します。スクリプトのchmod +x
を忘れずに!
: /opt/init_vxlan.sh eth0 172.21.0.100 vxlan0 10.225.194.171/9 10.255.255.255 100.64.158.4 100.64.158.132 >> /opt/init_vxlan.log 2>&1
以下の引数を先ほどメモしておいたIPアドレスき置き換えます。
- 第1引数 : EC2インスタンスのENI(今回はeth0)
- 第2引数 : EC2インスタンスのPrivate IP(今回は172.21.0.100)
- 第4引数 : EC2インスタンスの
innerIpAddress
とnetmask
(今回は10.225.194.171/9) - 第6引数 : 1つ目のGateピアの
outerIpAddress
(今回は100.64.158.4) - 第7引数 : 2つ目のGateピアの
outerIpAddress
(今回は100.64.158.132)
上記コマンドを一度実行し、問題がなさそうであれば再起動しましょう。再起動してきたら、ifconfig
でネットワークインターフェースvxlan0
を確認します。
[ec2-user@ip-172-21-0-100 ~]$ ifconfig vxlan0 vxlan0 Link encap:Ethernet HWaddr AA:A0:6F:BA:66:89 inet addr:10.225.194.171 Bcast:10.255.255.255 Mask:255.128.0.0 inet6 addr: fe80::a8a0:6fff:feba:6689/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:8951 Metric:1 RX packets:24 errors:0 dropped:0 overruns:0 frame:0 TX packets:10 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1608 (1.5 KiB) TX bytes:736 (736.0 b) [ec2-user@ip-172-21-0-100 ~]$
VXLANトンネルが有効になっていますね。MTUが大きめになっているので、大きいデータなどをやり取りする場合は、フラグメントを防ぐためのMTUの調整が必要になるかもしれません。
この状態でSIMを差したデバイスのIP(SORACOMユーザーコンソールのSIM管理で確認できます。)に向けてpingやSSH接続を試行すると正常に接続できるはずです。多くのIoTゲートウェイでは、セキュリティ対策としてSSHログインが既定で禁止されていますので、許可しつつ試しましょう。以下はOpenBlocks BX1のSSH許可設定画面です。
注意事項
VXLANトンネルを確立するEC2インスタンスでIP転送を有効しVPCのルーティングテーブルをインスタンスに向ける *2ことで、他のEC2インスタンスからVXLANインスタンス経由でIoTゲートウェイにデータを送出することが可能です。ただし、Gateの既定の構成では、行きと帰りで経路が異なることになります。下図のように、SIM→VPCは引き続きNAT経由になるので、双方向通信のために利用する場合は注意が必要です。
まとめ
IoTゲートウェイのリモートメンテナンスは、これまでゲートウェイとリモートホスト間でVPNを構築したり、メンテナンス用エージェントソフトをIoTゲートウェイで常時実行するなど、IoTゲートウェイの負荷が大きいソリューションが一般的でした。SORACOM Gateを利用することで、閉域網によるセキュリティは確保しつつ、IoTゲートウェイに負担をかけないメンテナンス手法として有用と考えます。